package edu.ucsur.PuntoDeVentas.DataAccess;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import edu.ucsur.PuntoDeVentas.BusinessEntity.ENUsuario;
import edu.ucsur.PuntoDeVentas.BusinessLogic.LNUsuario;

public class ADUsuario{

    /* INICIO: Singleton */
    private static ADUsuario _instance = null;

    public static ADUsuario Instance()
    {
        if (_instance == null)
            _instance = new ADUsuario();
        return _instance;    
    }
    /* FIN: Singleton */
    
		  /**
		   * Definiendo una variable de referencia de tipo
		   * conexión.
		   */
		  private Connection conn;
		  
		  /**
		   * Creando el constructor con 1 argumento (conexión a la BD)
		   * 
		   * @param conn
		   */
		  public ADUsuario() {
		    //
		  }
		  
		  /**
		   * Método que valida si el usuario existe en la tabla usuario.
		   * 
		   * @param codigoUsuario
		   * @param clave
		   * @return  Verdadero (si existe) o falso (si no existe).
		   */
		  public boolean fbool_ExisteUsuario(String codigoUsuario,
		                               String clave)
		    throws Exception {
		    try {
		      conn = ADDBConnection.getConnection();
		      //-- Armando la sentencia SQL
		      String sql = "select * from usuario " +
		                   " where codigo_usuario = ?" +
		                   "   and clave = ?";
		      //-- Preparando la sentencia en Java
		      PreparedStatement pstmt = conn.prepareStatement(sql);
		      //-- ¿Y como seteamos los parametros?
		      //-- Simple, con setters
		      pstmt.setString(1, codigoUsuario);
		      pstmt.setString(2, clave);
		      //-- Una vez que el SQL está listo para ejecutarse
		      //-- se lanza. El resultado se recibe en una variable
		      //-- de tipo ResultSet (cursor)
		      ResultSet rs = pstmt.executeQuery();
		      //-- Recorriendo el resultset
		      if (rs.next()) {
		        return true;
		      }
		      return false;
		    } catch (Exception ex) {
		      ex.printStackTrace();
		      throw ex;
		    } finally {
		      conn.close();
		    }
		  }
		  
		  public List<ENUsuario> getListaUsuarios() throws Exception {
		    try {
		      conn = ADDBConnection.getConnection();
		      List<ENUsuario> lista = new ArrayList<ENUsuario>();
		      //-- Armando la sentencia SQL
		      String sql = "select * from usuario ";
		      //-- Preparando la sentencia en Java
		      Statement pstmt = conn.createStatement();
		      //-- Una vez que el SQL está listo para ejecutarse
		      //-- se lanza. El resultado se recibe en una variable
		      //-- de tipo ResultSet (cursor)
		      ResultSet rs = pstmt.executeQuery(sql);
		      //-- Recorriendo el resultset
		      while (rs.next()) {
		        ENUsuario u = new ENUsuario();
		        u.setUsuario(rs.getString("codigo_usuario"));
		        u.setNombres(rs.getString("nombres"));
		        u.setApellidos(rs.getString("apellidos"));
		        u.setFechaNacimiento(rs.getDate("fecha_nacimiento"));
		        u.setCorreo(rs.getString("correo"));
		        u.setFoto(rs.getBytes("foto"));
		        u.setSueldo(rs.getDouble("sueldo_anual"));
		        lista.add(u);
		      }
		      return lista;
		    } catch (Exception ex) {
		      ex.printStackTrace();
		      throw ex;
		    } finally {
		      conn.close();
		    }
		  }

		  public void insertarUsuario(ENUsuario bean) throws Exception {
		    try {
		      conn = ADDBConnection.getConnection();
		      //-- Armando la sentencia SQL
		      String sql = "insert into usuario ( codigo_usuario, clave, nombres, apellidos, fecha_nacimiento, correo, foto, sueldo_anual ) " +
		                   " values ( ?, ?, ?, ?, ?, ?, ?, ? )";
		      //-- Preparando la sentencia en Java
		      PreparedStatement pstmt = conn.prepareStatement(sql);
		      //-- ¿Y como seteamos los parametros?
		      //-- Simple, con setters
		      pstmt.setString(1, bean.getUsuario());
		      pstmt.setString(2, bean.getClave());
		      pstmt.setString(3, bean.getNombres());
		      pstmt.setString(4, bean.getApellidos());
		      pstmt.setDate(5, new java.sql.Date(bean.getFechaNacimiento().getTime()));
		      pstmt.setString(6, bean.getCorreo());
		      pstmt.setBytes(7, bean.getFoto());
		      pstmt.setDouble(8, bean.getSueldo());
		      //-- Una vez que el SQL está listo para ejecutarse
		      //-- se lanza. El resultado se recibe en una variable
		      //-- de tipo ResultSet (cursor)
		      pstmt.execute();
		    } catch (Exception ex) {
		      ex.printStackTrace();
		      throw ex;
		    } finally {
		      conn.close();
		    }
		  }
		  
		}
